from typing import List

INT_MAX = 10 ** 5 + 1


class Solution:
    """
    能够取得更大值的前提条件：
    abs(nums[i+1]-nums[i])+abs(nums[j]-nums[j-1]) > abs(nums[j-1]-nums[i])+abs(nums[j]-nums[i+1])

    【第1种选择】寻找nums[i+1]<nums[i]时，nums[i]的最小值
    已知nums[i+1]<nums[i]，当nums[j]<nums[j-1]时，取得更大值只有：nums[i]<nums[j]
    nums[i+1]<nums[i]<nums[j]<nums[j-1] 翻转 [i+1,j-1] -> 增加 2*(nums[j]-nums[i])  方案1.1
    已知nums[i+1]<nums[i]，当nums[j-1]<nums[j]时，取得更大值只有：nums[i]<nums[j-1]
    nums[i+1]<nums[i]<nums[j-1]<nums[j] 翻转 [i+1,j-1] -> 增加 2*(nums[j-1]-nums[i])  方案1.2
    (nums[i+1]<nums[j-1]<nums[i]<nums[j] 翻转 [i+1,j-1] -> 不变)

    【第2种选择】寻找nums[i]<nums[i+1]时，nums[i+1]的最小值
    已知nums[i]<nums[i+1]，当nums[j-1]<nums[j]时，取得更大值只有：nums[i+1]<nums[j-1]
    nums[i]<nums[i+1]<nums[j-1]<nums[j] 翻转 [i+1,j-1] -> 增加 2*(nums[j-1]-nums[i+1])  方案2.1
    已知nums[i]<nums[i+1]，当nums[j]<nums[j-1]时，取得更大值只有：nums[i+1]<nums[j]
    nums[i]<nums[i+1]<nums[j]<nums[j-1] 翻转 [i+1,j-1] -> 增加 2*(nums[j]-nums[i+1])  方案2.2
    (nums[i]<nums[j]<nums[i+1]<nums[j-1] 翻转 [i+1,j-1] -> 不变)

    将第1种选择和第2种选择反向，于是有：

    【第3种选择】寻找nums[i]<nums[i+1]时，nums[i]的最大值
    nums[i+1]>nums[i]>nums[j]>nums[j-1] 翻转 [i+1,j-1] -> 增加 2*(nums[i]-nums[j])  方案3.1
    nums[i+1]>nums[i]>nums[j-1]>nums[j] 翻转 [i+1,j-1] -> 增加 2*(nums[i]-nums[j-1])  方案3.2

    【第4种选择】寻找nums[i+1]<nums[i]时，nums[i+1]的最大值
    nums[i]>nums[i+1]>nums[j-1]>nums[j] 翻转 [i+1,j-1] -> 增加 2*(nums[i+1]-nums[j-1])  方案4.1
    nums[i]>nums[i+1]>nums[j]>nums[j-1] 翻转 [i+1,j-1] -> 增加 2*(nums[i+1]-nums[j])  方案4.2

    在开头和结尾交换，于是有：
    【第5种选择】
    nums[0]<nums[j-1]<nums[j] 翻转 [0,j-1] -> 增加 (nums[j-1]-nums[0]) 方案5.1
    nums[0]>nums[j-1]>nums[j] 翻转 [0,j-1] -> 增加 (nums[0]-nums[j-1]) 方案5.2
    【第6种选择】
    nums[i]<nums[i+1]<nums[-1] 翻转 [i+1,-1] -> 增加 (nums[-1]-nums[i+1]) 方案6.1
    nums[i]>nums[i+1]>nums[-1] 翻转 [i+1,-1] -> 增加 (nums[i+1]-nums[-1]) 方案6.2

    等于的情况处理：
    当nums[i]==nums[i+1]时，视作nums[i]<nums[i+1]还是nums[i+1]<nums[i]都可以
    当nums[i+1]==nums[j-1]时，结果不变
    当nums[j]==nums[j-1]时，视作nums[j]<nums[j-1]还是nums[j-1]<nums[j]都可以
    """

    def maxValueAfterReverse(self, nums: List[int]) -> int:
        size = len(nums)

        # 计算当前的数组值
        ans1 = 0
        for i in range(size - 1):
            ans1 += abs(nums[i + 1] - nums[i])

        ans2 = 0

        # 遍历寻找8种情况寻找最优解
        choose1, choose2, choose3, choose4 = INT_MAX, INT_MAX, -INT_MAX, -INT_MAX
        for i in range(size):
            # 根据当前情况在之前寻找最优解
            if i > 0:
                if nums[i - 1] <= nums[i]:
                    ans2 = max(ans2,
                               2 * (nums[i - 1] - choose1),  # 方案1.2
                               2 * (nums[i - 1] - choose2),  # 方案2.1
                               2 * (choose3 - nums[i]),  # 方案3.1
                               2 * (choose4 - nums[i]),  # 方案4.2
                               nums[i - 1] - nums[0],  # 方案5.1
                               nums[-1] - nums[i])  # 方案6.1
                else:
                    ans2 = max(ans2,
                               2 * (nums[i] - choose1),  # 方案1.1
                               2 * (nums[i] - choose2),  # 方案2.2
                               2 * (choose3 - nums[i - 1]),  # 方案3.1
                               2 * (choose4 - nums[i - 1]),  # 方案4.2
                               nums[0] - nums[i - 1],  # 方案5.2
                               nums[i] - nums[-1])  # 方案6.2

            # 记录当前情况供之后寻找最优解
            if i < size - 1:
                if nums[i + 1] <= nums[i]:
                    choose1 = min(choose1, nums[i])  # 第1种情况
                    choose4 = max(choose4, nums[i + 1])  # 第4种情况
                else:  # nums[i] < nums[i+1]
                    choose2 = min(choose2, nums[i + 1])  # 第2种情况
                    choose3 = max(choose3, nums[i])  # 第3种情况

            # print(choose1, choose2, choose3, choose4, ans2)

        # print("原始数组值:", ans1, "增加数组值:", ans2)

        return ans1 + ans2


if __name__ == "__main__":
    print(Solution().maxValueAfterReverse(nums=[2, 3, 1, 5, 4]))  # 10
    print(Solution().maxValueAfterReverse(nums=[2, 4, 9, 24, 2, 1, 10]))  # 68

    # 测试用例14/16
    print(Solution().maxValueAfterReverse(nums=[2, 5, 1, 3, 4]))  # 11
